#ifndef RECEIVER_H
#define RECEIVER_H

#include <algorithm/shared/utils/Para.h>
#include <utils/ParaUtils.h>

#include <boost/describe.hpp>

#include <atomic>
#include <cstdlib>
#include <memory>

namespace solar
{
    class Material;
    class Geometry;

    class Receiver : public Para
    {
        public:
            ~Receiver() override = default;
            Receiver();
            Receiver(Receiver&& another) noexcept;
            Receiver(Receiver& another) = default;
            auto operator=(Receiver&& another) noexcept -> Receiver&;
            auto operator=(const Receiver& another) -> Receiver& = default;

#include <utils/class_name.inc>
            static std::atomic_int receiver_cnt_;

        private:
            std::uint64_t id_;
            // MaterialType material_type_;
            // GeometryType geometry_type_;
            std::shared_ptr<Material> material_;
            std::shared_ptr<Geometry> geometry_;
            BOOST_DESCRIBE_CLASS(Receiver, (Para), (), (), (id_, material_, geometry_))
    };

} // namespace solar
#define CURRENT_CLASS_NAME Receiver
#include <utils/class_describe_header.inc>
SOLAR_DESCRIBE_CLASS(Receiver, (Para), (), (), (id_, material_, geometry_))
#endif
